[Day 10] 有了makefile了? 那我們開始編譯吧! - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
在前面的章節中我們學會寫makefile → 在prompt 端下指令:make/make build_simple/make build_c11
產生相對應的執行檔:dog_meme / dog_meme_with_h/dog_meme_without_h
如果要執行執行檔的話
就在下make run/make run run_build_simple/make run day03_single
就可以執行出想要的結果了
make clean 和 .PHONY ,是必要的嗎? 他們的作用是什麼?-j/-n/-k/-C/-f/-B/-s 的用途、使用場景把建置產物(執行檔、.o/.d、build/ 等)清掉,讓工作區恢復乾淨,避免舊檔干擾,便於切換編譯選項或debug
Make 會把目標名當作檔案名來比對時間戳。若你剛好有一個名叫 clean 或 run 的檔案存在,make clean/make run 會被判定「已最新」而不執行。
把它宣告成 .PHONY,Make 就不再把它視為檔案,比對時間戳的這套規則就不會套用,每次都會執行。
-j [N] = --jobs[=N](平行編譯)做什麼:同時跑多個目標;N 是工作數。省略 N 會讓 make 盡量跑很多工作(等同「不設上限」)。
怎麼用:
make -j8 # 用 8 執行緒 make -j # 盡可能多(可能把機器跑滿)
地雷:規則需「平行安全」(不可同時寫同一個檔)。若有問題,可暫時用 .NOTPARALLEL: 或去掉 -j。
-n = --just-print / --dry-run(只顯示、不執行)make -n all
-j 也只會「列印並行排程的命令」,不會真的跑。-k = --keep-going(遇錯不停)make -k all
-C DIR = --directory=DIR(先切目錄再做)做什麼:在執行前先 cd 到 DIR。可重複多次(逐層切)。
怎麼用:
make -C src make -C build -f ../Makefile
小註:遞迴建置常搭配 $(MAKE) 使用;$(MAKE) 會自動傳遞目前的 flags(如 -j)。
-f FILE = --file=FILE / --makefile=FILE(指定 Makefile)做什麼:用指定檔案而非預設的 Makefile/makefile。
怎麼用:
make -f Makefile.debug make -f base.mk -f local.mk # 可指定多個,後面的可覆寫前面
-B = --always-make(強制重建)make -B
make clean && make;-B 適合快速驗證規則是否正確。-s = --silent / --quiet(靜音)@)。make -s all
V=1 這類自訂開關控制。